package org.zhao.nettydemos.pipeline;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise;
import lombok.extern.slf4j.Slf4j;

/**
 * @Auther: xiaohui.zhao
 * @Date: 2021/9/15 08:58
 * @Description:  出站流水线
 *
 * Channel Handler ChannelHandlerContext之间的关系
 * Channel拥有一条ChannelPipeline , 每一个流水线节点为一个ChannelHandlerContext上下文对象 ， 每一个上下文中包裹了一个ChannelHandler
 * 在 ChannelHandler的入站/出站处理方法中，netty会传递一个Context实例作为实际参数。
 * 处理器中的回调代码也可以通过context实参 ， 在业务处理过程中获取ChannelPipeline实例或者Channel实例
 *
 */
@Slf4j
public class OutPipeline {

    static class SimpleOutHandlerA extends ChannelOutboundHandlerAdapter{

        @Override
        public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise)throws Exception{
            log.info("出站处理器A 被回调");
            super.write(ctx,msg,promise);
        }

    }

    static class SimpleOutHandlerB extends ChannelOutboundHandlerAdapter{

        @Override
        public void write(ChannelHandlerContext ctx,Object msg,ChannelPromise promise) throws Exception{
            log.info("出站处理器B 被回调");
            super.write(ctx,msg, promise);
        }

    }

    static class SimpleOutHandlerC extends ChannelOutboundHandlerAdapter{

        @Override
        public void write(ChannelHandlerContext ctx,Object msg,ChannelPromise promise)throws Exception{
            log.info("出站处理器C 被回调");
            super.write(ctx,msg,promise);
        }

    }

}